package cplus_cplus_std

import (
	"errors"
)

// Queue 泛型队列容器
type Queue[T any] struct {
	data []T
}

// New 创建一个新的队列
func MakeQueueObj[T any]() *Queue[T] {
	return &Queue[T]{
		data: make([]T, 0),
	}
}

// Size 返回队列中元素的数量
func (q *Queue[T]) Size() int {
	return len(q.data)
}

// Empty 判断队列是否为空
func (q *Queue[T]) Empty() bool {
	return len(q.data) == 0
}

// Front 返回队列的第一个元素
func (q *Queue[T]) Front() (T, error) {
	if q.Empty() {
		var zero T
		return zero, errors.New("queue is empty")
	}
	return q.data[0], nil
}

// Back 返回队列的最后一个元素
func (q *Queue[T]) Back() (T, error) {
	if q.Empty() {
		var zero T
		return zero, errors.New("queue is empty")
	}
	return q.data[len(q.data)-1], nil
}

// Push 将元素添加到队列尾部
func (q *Queue[T]) Push(value T) {
	q.data = append(q.data, value)
}

// Pop 移除队列的第一个元素
func (q *Queue[T]) Pop() error {
	if q.Empty() {
		return errors.New("queue is empty")
	}
	q.data = q.data[1:]
	return nil
}

// Clear 清空队列
func (q *Queue[T]) Clear() {
	q.data = make([]T, 0)
}
